from lineaBase import LineaBase
from fase import Fase
from proyecto import Proyecto
from item import Item
from estadoLB import EstadoLB, db_session
from sqlalchemy import exc
from flask import flash
session = db_session()

class LineaBaseManager(object):
    """Clase encargada del manejo de lineas base"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<LineBase Manager>'
    
    def guardarLineaBase(self, lineaBase):
        """
        Metodo encargado de almacenar una linea base en la base de datos
        @param lineaBase: Objeto linea base que se desea guardar.
        """
        session.add(lineaBase)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("La linea base ya existe", "error")
        else:
            return flash("Linea base registrada exitosamente")
#        session.close()
        
    def eliminarLineaBase(self, idlineabase):
        """
        Metodo encargado de eliminar una linea base de la base de datos
        @param idlineabase: id de la linea base que se desea eliminar.
        """
#        session = db_session()
        lineaBase = session.query(LineaBase).filter(LineaBase.idlineabase == idlineabase).first()
        session.delete(lineaBase)
        session.commit()
        
    def getLineaBase(self, idlineabase):
        """
        Metodo encargado de retornar una linea base dado su idlineabase
        @param idlineabase: id de la linea base que se desea obtener.
        """
        lineaBase = session.query(LineaBase).filter(LineaBase.idlineabase == idlineabase).first()
        return lineaBase
    
    def getLineasBase(self):
        """Metodo encargado de retornar todas las lineas base"""
        lineasBase = session.query(LineaBase).order_by(LineaBase.observacion)
        return lineasBase
    
    def getLineaBaseFiltradoPorObservacion(self, observacion):
        """
        Metodo encargado de retornar una linea base dada su observacion
        @param observacion: observacion de la linea base que se desea obtener.
        """
        if observacion == "":
            observacion = "%"
        else:
            observacion = "%" + observacion + "%"
        lineaBase = session.query(LineaBase).filter(LineaBase.observacion.like(observacion)).order_by(LineaBase.observacion)
        return lineaBase
    
    def getLineaBasePorObservacion(self, observacion):
        """
        Metodo encargado de retornar una linea base dada su observacion
        @param observacion: observacion de la linea base que se desea obtener.
        """
        lineaBase = session.query(LineaBase).filter(LineaBase.observacion == observacion).first()
        return lineaBase
    
    def getLineaBasePaginado(self, idfase, observacion, desde, hasta):
        """
        Metodo encargado de retornar un usuario dado su nombre
        @param idfase: id de la fase cuyas lineas base se desean obtener.
        @param observacion: observacion de la linea base que se desea obtener.
        @param desde: indica inicio.
        @param hasta: indica fin.
        """
        if observacion == "":
            observacion = "%"
        else:
            observacion = "%"+observacion+"%"

        if desde != None and hasta != None:
            lb = session.query(LineaBase).join(Item).join(Fase).join(Proyecto).filter(Fase.idfase==idfase).\
                                        filter(LineaBase.observacion.like(observacion)).order_by(LineaBase.observacion).distinct()[desde:hasta]
            return lb
        else:
            total = session.query(LineaBase).join(Item).join(Fase).join(Proyecto).filter(Fase.idfase==idfase).\
                                        filter(LineaBase.observacion.like(observacion)).distinct().count()
            return total
    
    def getLineaBasePorFase(self, idfase):

        lineasBase = session.query(LineaBase).join(Item).join(Fase).join(Proyecto).filter(Fase.idfase==idfase).distinct().all()
        return lineasBase